﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace CoTuong
{
    [Serializable]
    public abstract class QuanCo
    {

        public Texture2D texture2D;
        public int cot;
        public int dong;
        public int quan;
        public bool isSelected;
        public Vector2 viTriQuanCo;
        public Vector2 ViTriDiChuyen;
        public static readonly int kcDong = 9; // khoang cach quan co theo dong`
        public static readonly int kcCot = 9; // khoang cach quan co theo cot
        public static readonly int framesizeX = 52;
        public static readonly int framesizeY = 52;

        public QuanCo(Texture2D texture2D, int dong, int cot, int quan, Boolean isSelected)
        {
            this.texture2D = texture2D;
            this.dong = dong;
            this.cot = cot;
            this.quan = quan;
            this.isSelected = isSelected;
            this.viTriQuanCo.X = cot * (framesizeX + kcCot);
            this.viTriQuanCo.Y = dong * (framesizeY + kcDong);
            this.ViTriDiChuyen.X = -framesizeX;
            this.ViTriDiChuyen.Y = -framesizeY;
        }

        public virtual void Update(GameTime gameTime)
        {
            if (QuanLyQuanCo.mouseClickedQuanCo.X > viTriQuanCo.X && QuanLyQuanCo.mouseClickedQuanCo.X < viTriQuanCo.X + framesizeX &&
                QuanLyQuanCo.mouseClickedQuanCo.Y > viTriQuanCo.Y && QuanLyQuanCo.mouseClickedQuanCo.Y < viTriQuanCo.Y + framesizeY)
            {
                isSelected = true;
            }
            else
            {
                isSelected = false;
                ViTriDiChuyen.X = -framesizeX;
                ViTriDiChuyen.Y = -framesizeY;
            }
            //Edit Frame
        }

        public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch) 
        {
            spriteBatch.Draw(texture2D, viTriQuanCo, null, Color.White,
                0, Vector2.Zero, 1, SpriteEffects.None, 1);

        }

        public void VeBuocDiQuanCo(int vtDong, int vtCot, SpriteBatch spriteBatch)
        {
            Vector2 ViTri = viTriQuanCo;
            ViTri.X = vtCot * (framesizeX + kcCot) + 10;
            ViTri.Y = vtDong * (framesizeY + kcDong) + 10;

            Color myTransparentColor = new Color(255, 255, 255, 127);
            spriteBatch.Draw(VanCo.DiemDiChuyen, ViTri, null, myTransparentColor,
                0, Vector2.Zero, 1, SpriteEffects.None, 0);
        }

        public void diChuyen(int vtDong, int vtCot)
        {
            
            ViTriDiChuyen.X = vtCot * (framesizeX + kcCot);
            ViTriDiChuyen.Y = vtDong * (framesizeY + kcDong);

            //Kiểm tra vị trí click chuột di chuyển
            if (QuanLyQuanCo.mouseClickedQuanCo.X > ViTriDiChuyen.X && QuanLyQuanCo.mouseClickedQuanCo.X < ViTriDiChuyen.X + framesizeX &&
                QuanLyQuanCo.mouseClickedQuanCo.Y > ViTriDiChuyen.Y && QuanLyQuanCo.mouseClickedQuanCo.Y < ViTriDiChuyen.Y + framesizeY)
            {
                //Di Chuyển Quân Cờ
                viTriQuanCo.X = vtCot * (framesizeX + kcCot);
                viTriQuanCo.Y = vtDong * (framesizeY + kcCot);

                //Hủy Chọn
                isSelected = false;
                QuanLyQuanCo.mouseClickedQuanCo = Vector2.Zero;   

                //Lưu vị trí cho UndoData
                UndoData data = new UndoData();
                data.preCol = cot;
                data.preRow = dong;
                data.col = vtCot;
                data.row = vtDong;
                data.ktQuanCo = QuanLyQuanCo.ktQuanCo[dong, cot];
                VanCo.undoData.Add(data);

                //Cập Nhật lại bàn cờ tại vị trí trước khi di chuyển
                QuanLyQuanCo.ktQuanCo[dong, cot] = 0;

                //Cập nhật vị trí quân cờ
                dong = vtDong;
                cot = vtCot;

                //Cập nhật lại bàn cờ tại vị trí đã di chuyển
                if (quan == 0)// Quân đỏ
                    QuanLyQuanCo.ktQuanCo[dong, cot] = 1;
                else //Quân xanh
                    QuanLyQuanCo.ktQuanCo[dong, cot] = 2;

                //Cập nhật lại lượt đi
                if (VanCo.LuotDi == 0)
                    VanCo.LuotDi = 1;
                else
                    VanCo.LuotDi = 0;

                
            }
        }

        public int getCot 
        {
            get { return cot; }
        }
        public void setCot(int cot)
        {
            this.cot = cot;
        }

        public int getDong
        {
            get { return dong; }
        }
        public void setDong(int dong)
        {
            this.dong = dong;
        }

        public bool getIsSelected
        {
            get { return isSelected; }
        }

        public int getQuan
        {
            get { return quan; }
        }

        public void setViTriQuanCo(Vector2 vitri)
        {
            viTriQuanCo.X = vitri.X;
            viTriQuanCo.Y = vitri.Y;
        }

    }
}
